#include "ipc/Ftok.h"
#include "ipc/Cola.h"
#include "tcp/tcp.h"
#include "log.h"
#include "ipc/Shm.h"
#include <stdlib.h>
#include <unistd.h>


#include <vector>

void extraerParametros(const char* buffer, size_t len, const char* comando, char* parametro){
    unsigned int i=0;
    size_t longitud_comando = strlen(comando);
    parametro[0] = 0;

    if(buffer[i] == ':'){ //prefijo
	for(;i<len && buffer[i] != ' ';i++);
	i++; //salteo el espacio
    }

    if(i<len){
	if(strncmp(&buffer[i], comando, longitud_comando)==0){
	    i+=longitud_comando+1;//salteo el comando y el espacio
	    unsigned int j=i;
	    for(;j<len && buffer[j] != ' ';j++);
	    memcpy(parametro, &buffer[i], j-i);
	    parametro[j-i]=0;

	    clog(AMARILLO, "ENCONTRADO MENSAJE '%s': '%s'\n",comando, parametro);
	}
    }
}


int main(int argc, char* argv[]){

    if(argc < 3){
	clog(ROJO, "%s <sock_fd> <id_conexion>\n", argv[0]);
	exit(-1);
    }

    int sockfd = atoi(argv[1]);
    if(sockfd <= 0){
	clog(ROJO, "Error, el socket no puede ser %d\n", sockfd);
	exit(-1);
    }

    int id_conexion = atoi(argv[2]);
    if(id_conexion <= 0){
	clog(ROJO, "Error, el id_conexion no puede ser %s\n", argv[2]);
	exit(-1);
    }

    std::string path;
    path = ftok_crear_archivo("DTN");
    if(path.size()==0){
	clog(ROJO, "Error, no se pudo obtener el path para FTOK.\n");
	exit(-1);
    }

    std::string pathServers;
    pathServers = ftok_crear_archivo("SERVERS");
    if(pathServers.size()==0){
	clog(ROJO, "Error, no se pudo obtener el path para FTOK (SERVERS).\n");
	exit(-1);
    }


    Cola cola(path.c_str(), 2);

    Shm servers(pathServers.c_str(), id_conexion);
    servers.borrar();

    //Saco mensajes de la cola y los mando por el socket

    std::vector<char> buffer;
    clog(MAGENTA, "Receptor vivito y coleando\n");
    while(cola.recibir(id_conexion, buffer)){
	clog(MAGENTA, "Leido el mensaje: %s\n", &buffer[0]);



	//Me fijo si es un mensaje tipo SERVER y si es extraigo el server
	char server[50];
	extraerParametros(&buffer[0],buffer.size(), "SERVER",server);

	if(server[0] != 0){
	    clog(AMARILLO, "Agrego al server '%s' a la shm\n", server);
	    char *base = (char*)servers.getBase();
	    
	    if(base[0] != 0)
		//no es el primero, agrego un espacio entre servers
		strcat(base, " ");
	    
	    strcat(base, server);
	    clog(AMARILLO, "SERVERS registrados: '%s'\n", base);
	}



	//Pongo el mensaje en el socket
	enviar(sockfd, (void*) &buffer[0], buffer.size());
    }

    clog(ROJO,"El receptor finaliza.\n");
    return 0;
}
